﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Skynet
{

    public partial class ucSyn : UserControl
    {
        public bool qqqq = false;
        private bool a = true;
        public frmSkynet pf;
        public Words words = new Words();
        public String OldWord;
        public String OldSyn;
        public bool CodeChange;
        public ucSyn()
        {
            InitializeComponent();
          


            foreach (Word Word in words.wordList)
            {
                dgvWord.Rows.Add(Word.Row);
            }
            foreach (Syn Syn in words.synList)
            {
                if (Syn.domainRow == words.wordList[0].Row)
                {
                    dgvSyn.Rows.Add(Syn.Row);
                }
            }

        }


        private void dgvDomian_CellValidated(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvWord[e.ColumnIndex, e.RowIndex].Value == null && OldWord != null)
            {
                dgvWord.CurrentCell.Value = OldWord;
                tsslDom.BackColor = Color.Blue;
                tsslDom.Text = "для удаления ячейки выделите ее и нажмите Del";
            }
            if (dgvWord[e.ColumnIndex, e.RowIndex].Value != null)
            {
                // проверим на пустые значения
                if (string.IsNullOrWhiteSpace(dgvWord[e.ColumnIndex, e.RowIndex].Value.ToString()))
                {
                    tsslDom.BackColor = Color.Red;
                    tsslDom.Text = "Пустое имя";
                    dgvWord.Tag = e.RowIndex;
                    return;
                }
                for (int i = 0; i < ((DataGridView)sender).RowCount - 1; i++)
                {
                    if (((DataGridView)sender)[e.ColumnIndex, e.RowIndex].Value.ToString() ==
                        ((DataGridView)sender)[e.ColumnIndex, i].Value.ToString() && e.RowIndex != i)
                    {
                        tsslDom.BackColor = Color.Red;
                        tsslDom.Text = "Повторяющиеся имена";
                        dgvWord.Tag = e.RowIndex;
                        return;

                    }
                }
                //если попали сюда значить все нормально
                bool domExist = false; // проверить на существование
                foreach (Word Word in words.wordList)
                {
                    if (Word.Row == ((DataGridView)sender).Rows[e.RowIndex])
                    {
                        domExist = true;
                    }
                }
                if (!domExist)
                {
                    var Word = new Word();
                    Word.Row = ((DataGridView)sender).CurrentRow;
                    words.wordList.Add(Word);
                }
            }
        }

        private void dgvDomian_RowEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvWord.Rows[e.RowIndex] != null)
            {
                if (dgvWord.Rows[e.RowIndex].Cells[0].Value != null)
                {
                    OldWord = dgvWord.Rows[e.RowIndex].Cells[0].Value.ToString();
                }
                else
                {
                    OldWord = null;
                }
            }
            else
            {
                OldWord = null;
            }
        }

        private void dgvDomian_Enter(object sender, EventArgs e)
        {
            if (!a)
            {
                dgvSyn.ReadOnly = true;
                dgvSyn.Rows.Clear();
            }
            else
            {
                a = false;
            }
            
        }

        private void dgvDomian_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                if (dgvWord.CurrentCell.Value != null)
                {
                    var a = pf.diagram.Nodes;
                    foreach (IconNode node in a)
                    {
                        if (node.word == dgvWord.CurrentRow.Cells[0].Value.ToString())
                        {
                            tsslDom.Text = "Данное имя используется";
                            dgvSyn.AllowUserToDeleteRows = false;
                        }
                    }

                }
            }
        }

        private void dgvDomian_MouseEnter(object sender, EventArgs e)
        {
            tsslDom.BackColor = Color.White;
            tsslDom.Text = "Введите в ячейку слово";
        }

        private void dgvDomian_SelectionChanged(object sender, EventArgs e)
        {
            CodeChange = true;
            dgvSyn.Rows.Clear();
            if (dgvWord.CurrentCell.Value != null)
            {
                // загружаем значения выделенного домена
                foreach (Syn Syn in words.synList)
                {

                    if (Syn.domainRow == dgvWord.CurrentRow)
                    {
                        dgvSyn.Rows.Add(Syn.Row);
                    }
                }
            }
            CodeChange = false;
            select_error();
        }
        private void select_error()
        {
            if (dgvWord.Tag != null)
            {
                int temp = (int)dgvWord.Tag;
                dgvWord.Tag = null;
                dgvWord.ClearSelection();
                dgvWord.CurrentCell = dgvWord[0, temp];
                dgvWord.Rows[temp].Selected = true;
                dgvWord.BeginEdit(true);
            }
        }

        private void dgvDomian_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {

            if (dgvWord.AllowUserToDeleteRows)
            {
                for (int i = 0; i < words.wordList.Count; i++)
                {
                    if (((Word)words.wordList[i]).Row == e.Row)
                    {
                        words.wordList.RemoveAt(i);
                    }
                }
                for (int i = 0; i < words.synList.Count; i++)
                {
                    if (((Syn)words.synList[i]).domainRow == e.Row)
                    {
                        words.synList.RemoveAt(i);
                    }
                }
            }
        }

        private void dgvSyn_CellValidated(object sender, DataGridViewCellEventArgs e)
        {
            if (!CodeChange)
            {
                DataGridView sender_ = (DataGridView)sender;
                // проверим на главный баг
                if (dgvSyn[e.ColumnIndex, e.RowIndex].Value == null && OldSyn != null)
                {
                    dgvSyn.CurrentCell.Value = OldSyn;
                    tsslDom.BackColor = Color.Blue;
                    tsslDom.Text = "для удаления ячейки выделите ее и нажмите Del";
                }
                if (dgvSyn[e.ColumnIndex, e.RowIndex].Value != null)
                {
                    // проверим на пустые значения
                    if (string.IsNullOrWhiteSpace(sender_[e.ColumnIndex, e.RowIndex].Value.ToString()))
                    {
                        tsslDom.BackColor = Color.Red;
                        tsslDom.Text = "Пустое значение";
                        sender_.Columns[0].Tag = e.RowIndex;
                        return;
                    }
                    for (int i = 0; i < sender_.RowCount - 1; i++)
                    {
                        if (sender_[e.ColumnIndex, i].Value != null)
                        {
                            if (sender_[e.ColumnIndex, e.RowIndex].Value.ToString() ==
                                sender_[e.ColumnIndex, i].Value.ToString() && e.RowIndex != i)
                            {
                                if (OldSyn != null)
                                {
                                    dgvSyn[e.ColumnIndex, e.RowIndex].Value = OldSyn;
                                }
                                tsslDom.BackColor = Color.Red;
                                tsslDom.Text = "Повторяющиеся значения";

                                sender_.Columns[0].Tag = e.RowIndex;
                                return;
                            }
                        }
                    }
                    //если попали сюда значить все нормально
                    bool existVal = false;
                    foreach (Syn Syn in words.synList)
                    {
                        if (Syn.Row == sender_.CurrentRow && Syn.domainRow == dgvWord.CurrentRow)
                        {
                            existVal = true;


                        }
                    }
                    if (!existVal)
                    {
                        var Syn = new Syn { Row = sender_.CurrentRow, domainRow = dgvWord.CurrentRow };
                        words.synList.Add(Syn);
                    }
                }
            }
        }

        private void dgvSyn_Enter(object sender, EventArgs e)
        {
            // надо загрузить инфу об значениях доменов
            if (dgvWord.CurrentCell.Value != null)
            {
                CodeChange = true;
                dgvSyn.ReadOnly = false;
                dgvSyn.Rows.Clear();
                if (dgvWord.CurrentCell.Value != null)
                {
                    // загружаем значения выделенного домена
                    foreach (Syn Syn in words.synList)
                    {
                        if (Syn.domainRow == dgvWord.CurrentRow)
                        {
                            dgvSyn.Rows.Add(Syn.Row);
                        }
                    }
                }
                CodeChange = false;
            }

        }



        private void dgvSyn_MouseEnter(object sender, EventArgs e)
        {
            tsslDom.BackColor = Color.White;
            tsslDom.Text = "Введите в ячейки значения";
        }

        private void dgvSyn_RowEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvSyn.Rows[e.RowIndex] != null)
            {
                if (dgvSyn.Rows[e.RowIndex].Cells[0].Value != null)
                {
                    OldSyn = dgvSyn.Rows[e.RowIndex].Cells[0].Value.ToString();
                }
                else
                {
                    OldSyn = null;
                }

            }
            else
            {
                OldSyn = null;
            }
        }

        private void dgvSyn_SelectionChanged(object sender, EventArgs e)
        {
            //Проверить на повторение
            select_error_Syn();
        }
        private void select_error_Syn()
        {
            if (dgvSyn.Columns[0].
                Tag != null)
            {
                int temp = (int)dgvSyn.Columns[0].Tag;
                dgvSyn.Columns[0].Tag = null;
                dgvSyn.ClearSelection();
                dgvSyn.CurrentCell = dgvSyn[0, temp];
                dgvSyn.Rows[temp].Selected = true;
                dgvSyn.BeginEdit(true);
            }
        }

        private void dgvSyn_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            for (int i = 0; i < words.synList.Count; i++)
            {
                if (((Syn)words.synList[i]).Row == e.Row)
                {
                    words.synList.RemoveAt(i);
                }
            }

        }

        private void dgvSyn_Validated(object sender, EventArgs e)
        {
            //Проверить на повторение
            select_error_Syn();
        }

        private void dgvDomian_Validated(object sender, EventArgs e)
        {
            select_error();
        }

        private void dgvDomian_KeyUp(object sender, KeyEventArgs e)
        {
            dgvWord.AllowUserToDeleteRows = true;
        }

        private void dgvDomian_CellMouseLeave(object sender, DataGridViewCellEventArgs e)
        {
            tsslDom.BackColor = Color.White;
            tsslDom.Text = "Редактирование слов";
        }

        private void tsbExit_Click(object sender, EventArgs e)
        {
            qqqq = true;
            this.ParentForm.Close();
        }

        private void tsbSave_Click(object sender, EventArgs e)
        {
            pf.words = this.words;
        }
    }
}

